Docker Compose & Profiles ๐ฆ
โ ๏ธ Local development only. This stack is not production-ready (Keycloak runs in
start-dev, demo/admin credentials, no secret validation). For production, a separate Postgres-based path exists underdocker/โ it is a different artifact.
The local environment is a single docker-compose.yml at the repo root. Optional
capabilities are turned on with Compose profiles instead of juggling many -f files.
๐๏ธ Always-on core (no profile)โ
Started by every docker compose up:
| Service | Purpose |
|---|---|
mongodb | Case data store |
keycloak | Identity / OAuth2 (port 8082) |
opa | Authorization policy engine |
minio | Object storage for attachments |
storage-api | File storage service (port 8085) |
camunda | Camunda 7 workflow engine (port 8080) |
case-engine-rest-api | Core case API (port 8081) |
c7-external-tasks | Camunda 7 external-task workers |
This is the minimum working environment.
๐งฉ Optional profilesโ
Enable with --profile <name> (or via COMPOSE_PROFILES in .env):
| Profile | Adds | What it gives you |
|---|---|---|
portal (default) | case-portal | The React UI on port 3001 |
demo (default) | demo-data-loader | One-shot loader that bootstraps the Keycloak realm/clients/demo user needed to log in and seeds sample cases, forms, and processes, then exits. Without it the portal has no realm/user to authenticate against. |
notifications | kafka, zookeeper, email-sender, websocket-publisher, novu-publisher | Event bus + email / websocket / Novu notifications. Set KAFKA_ENABLED=true so the engine publishes. |
proxy | traefik | Reverse proxy / dashboard (port 8888) |
docker compose up -d # core + portal + demo seed (login-ready)
COMPOSE_PROFILES=portal docker compose up -d # portal, NO seed (can't log in until seeded)
COMPOSE_PROFILES= docker compose up -d # backend only (run portal via yarn)
KAFKA_ENABLED=true docker compose --profile portal --profile demo --profile notifications up -d
docker compose down # stop (keeps data volumes)
๐ผ๏ธ Images vs. building from sourceโ
Every app service has both an image: (pulled from the public GHCR registry,
ghcr.io/wkspower/*) and a build:. So:
docker compose up -dpulls pre-built images โ no Java/Node build, no Maven.docker compose up -d --buildcompiles from source (multi-stage Docker builds; no host Maven needed either).
Pin the image tag with WKS_VERSION in .env (default: the latest release).